package com.rimi.project.util;

import java.util.Base64;

import javax.crypto.Cipher;

import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

/*
 *  	给定一个字符串，实现对该字符串进行加密，和解密
 */
public class DESUtil {

	// 提供一个加密的算法
	private static String algorithmType = "DES";
	// 提供一个秘钥字符串
	private static String key = "rimi";
	// 加密对象
	private static Cipher cipher = null;
	// 秘钥对象
	private static SecretKey  securekey = null;
	
	static {
		try {
			// 根据算法名称，获取一个加密对象的实例
			cipher = Cipher.getInstance(algorithmType);
			// 根据秘钥字符串，生成一个用来进行加密的秘钥
			// 秘钥字符串必须是8的倍数，如果不是，需要强转为8的倍数，如果使用base64转为64的倍数，请不要超过64位。
			DESKeySpec desKey = new DESKeySpec(Base64.getEncoder().encode(key.getBytes()));
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(algorithmType);
			securekey = keyFactory.generateSecret(desKey);
		} catch (Exception e) {
			e.printStackTrace();
		} 
		 
	}
	
	public static String encode(String encode)  {
		if(null == encode) {
			return null;
		}
		
		byte[] res = null;

		try {
			// 初始化加密对象，ENCRYPT_MODE代表加密模式
			cipher.init(Cipher.ENCRYPT_MODE,securekey);
			// 执行加密
			res = cipher.doFinal(encode.getBytes());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		// 加密完成，转化成8的倍数 ，利用Base64编码
		return new String(Base64.getEncoder().encode(res));

	}
	
	public static String decode(String decode) {
		if(null == decode) {
			return null;
		}
		byte[] res = null;
		try {
			// 初始化加密对象，DECRYPT_MODE代表解密模式
			cipher.init(Cipher.DECRYPT_MODE,securekey);
			// 进行解密，解密时候注意，解密的字符串，必须是8的倍数，利用Base64解码
			res = cipher.doFinal(Base64.getDecoder().decode(decode));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		return new String(res);
	}
	
	public static void main(String[] args) {
		String string = "明天放假了";
		String encode = DESUtil.encode(string);
		String decode = DESUtil.decode(encode);
		System.out.println("原字符串：" + string);
		System.out.println("加密后字符串：" + encode);
		System.out.println("解密后字符串：" + decode);
	}
}
